#pragma
#include<iostream>
#include <string>
#include<jsoncpp/json/json.h>


const std::string blank_space_sep=" ";
const std::string protocol_sep="\n";
//计算的请求  序列化和反序列化

std::string Encode(std::string& content)
{
    std::string package=std::to_string(content.size());
    package+=protocol_sep;
    package+=content;
    package+=protocol_sep;

    return package;
}

//"len"\n"x op y"\n
bool Decode(std::string& package,std::string* content)
{
    //
    std::size_t pos=package.find(protocol_sep);
    if(pos==std::string::npos)  return false;
    std::string len_str=package.substr(0,pos);

    std::size_t len=std::stoi(len_str);

    std::size_t total_len=len_str.size()+len+2;

    if(package.size()<total_len)    return false;
    //从/n下一位位置开始 截取len个长度
    *content=package.substr(pos+1,len);
    //erase移除报文
    package.erase(0,total_len);
    
    return true;
}
class Request
{
public:
    Request(int data1,int data2,char ops):x(data1),y(data2),op(ops)
    {}
    Request()
    {}
    
    bool Serialize(std::string *out)
    {
#ifdef Myself
        //struct-->string x op y ==> len\n"x op y"
        std::string s=std::to_string(x);
        s+=blank_space_sep;
        s+=op;
        s+=blank_space_sep;
        s+=std::to_string(y);

        //封装报头
        *out=std::to_string(s.size());
        *out+=protocol_sep;
        *out+=s;

        return true;
#else
        Json::Value root;
        
        root["x"]=x;
        root["y"]=y;
        root["op"]=op;
        Json::FastWriter fs;
        *out=fs.write(root);
        return true;
#endif
    }
    bool Deserialize(const std::string in)//"x op y"
    {
        std::size_t left=in.find(blank_space_sep);
        if(left==std::string::npos)  return false;
        std::string part_x=in.substr(0,left);
        
        size_t right=in.find(blank_space_sep);
        if(right==std::string::npos)
            return false;
        std::string part_y =in.substr(right+1);

        if(left+2!=right)
            return false;
        op=in[left+1];

        x=std::stoi(part_x);
        y=std::stoi(part_y);
        return true;


    }
public:
    int x;
    int y;
    char op;// + —— * /

};

// 
class Response
{
public:
    Response(int res,int c):result(res),code(c)
    {}
    Response()
    {}
    bool Serialize(std::string* out)
    {
        std::string s=std::to_string(result);
        s+=blank_space_sep;
        s+=std::to_string(code);
        *out=s;

        return true;
    }
    bool Deserialize(std::string& in)
    {
        //pos找空格 
        size_t pos=in.find(blank_space_sep);
        if(pos==std::string::npos)
            return false;
        std::string part_left=in.substr(0,pos);
        std::string part_right=in.substr(pos+1);
        result=std::stoi(part_left);
        code=std::stoi(part_right);

        return true;
    }
    void DubugPrint()
    {
        std::cout<<"结果相应完成： "<<std::endl;
    }
public:
    int result;
    int code;//0，可信，否则！0具体是几 表明对应的错误原因

};